/**
 * Copyright (c) 2015-2020, imos.cc;
 * Author for Asher Xu (asher.xu@aliyun.com).
 */

package cc.imos.communal.kit;

import org.springframework.util.StringUtils;

import java.security.InvalidParameterException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 时间工具类
 * 
 * @version 1.0 2016年5月10日 上午2:57:44 Asher Xu
 * @author Asher Xu
 */
public class DateKit {

	/** 时间格式：yyyy-MM-dd */
	public static final String dF = "yyyy-MM-dd";
	/** 时间格式：yyyy-MM-dd HH:mm:ss */
	public static final String dTF = "yyyy-MM-dd HH:mm:ss";
	/** 时间格式：yyyy-MM-dd HH:mm:sss */
	public static final String dTsF = "yyyy-MM-dd HH:mm:sss";

	/** 字符串格式：yyyyMMdd */
	public static final String dS = "yyyyMMdd";
	/** 字符串格式：yyyyMMddHHmmss */
	public static final String dTS = "yyyyMMddHHmmss";
	/** 字符串格式：yyyyMMddHHmmsss */
	public static final String dTsS = "yyyyMMddHHmmsss";
	/** 字符串格式：HHmmss */
	public static final String tS = "HHmmss";
	/** 字符串格式：yyyyMM */
	public static final String yM = "yyyyMM";

	// -------------------- >> Str to Date Start

	/**
	 * Str to Date <br />
	 * StrKit.isBlank(str) ? new Date() : toDate()
	 * 
	 * @param str
	 * @param f
	 * @return
	 * @version 1.0 2016年11月2日 下午3:03:09 Asher Xu <br />
	 * @author Asher Xu
	 */
	public static Date toDate(String str, String f) {
		if (StringUtils.hasText(str))
			return new Date();
		SimpleDateFormat sdf = new SimpleDateFormat(f);
		Date date = null;
		try {
			date = sdf.parse(str);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}

	/** F：yyyy-MM-dd */
	public static Date toDateDF(String str) {
		return toDate(str, dF);
	}

	/** F：yyyy-MM-dd HH:mm:ss */
	public static Date toDateDTF(String str) {
		return toDate(str, dTF);
	}

	/** F：yyyy-MM-dd HH:mm:sss */
	public static Date toDateDTsF(String str) {
		return toDate(str, dTsF);
	}

	/** F：yyyyMMdd */
	public static Date toDateDS(String str) {
		return toDate(str, dS);
	}

	/** F：yyyyMMddHHmmss */
	public static Date toDateDTS(String str) {
		return toDate(str, dTS);
	}

	/** F：yyyyMMddHHmmsss */
	public static Date toDateDTsS(String str) {
		return toDate(str, dTsS);
	}

	// -------------------- >> Str to Date End

	// -------------------- >> Date to Str Start

	/**
	 * Date to Str <br />
	 * date == null ? new Date() : toStr()
	 * 
	 * @param date
	 * @param f
	 * @return
	 * @version 1.0 2016年6月14日 下午7:37:20 Asher Xu
	 * @author Asher Xu
	 */
	public static String toStr(Date date, String f) {
		if (date == null)
			date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat(f);
		return sdf.format(date);
	}

	/** 字符串格式：yyyy-MM-dd */
	public static String toStrDF(Date date) {
		return toStr(date, DateKit.dF);
	}

	/** 字符串格式：yyyy-MM-dd HH:mm:ss */
	public static String toStrDTF(Date date) {
		return toStr(date, DateKit.dTF);
	}

	/** 字符串格式：yyyy-MM-dd HH:mm:sss */
	public static String toStrDTsF(Date date) {
		return toStr(date, DateKit.dTsF);
	}

	/** 字符串格式：yyyyMMdd */
	public static String toStrDS(Date date) {
		return toStr(date, dS);
	}

	/** 字符串格式：yyyyMMddHHmmss */
	public static String toStrDTS(Date date) {
		return toStr(date, dTS);
	}

	/** 字符串格式：yyyyMMddHHmmsss */
	public static String toStrDTsS(Date date) {
		return toStr(date, dTsS);
	}

	/**
	 * 字符串格式：HHmmss
	 * 
	 * @param date
	 * @return
	 * @version 1.0 2016年11月23日 上午11:29:59 Anthony.Gong <br />
	 * @author Anthony.Gong
	 */
	public static String toStrTS(Date date) {
		return toStr(date, tS);
	}

	// -------------------- >> Date to Str Start

	/**
	 * new Date() i 天后的时间
	 * 
	 * @param i
	 * @return
	 * @version 1.0 2016年6月14日 下午7:40:50 Asher Xu
	 * @author Asher Xu
	 */
	public static Date beforeAfterDay(int i) {
		return beforeAfterDay(null, i);
	}

	/**
	 * data i 天后的时间<br />
	 * data == null ? new Date(): beforeAfterDay()
	 * 
	 * @param date
	 * @param i
	 * @return
	 * @version 1.0 2016年6月14日 下午7:38:35 Asher Xu
	 * @author Asher Xu
	 */
	public static Date beforeAfterDay(Date date, int i) {
		Calendar calendar = calendar(date);
		calendar.add(Calendar.DAY_OF_MONTH, i);
		date = calendar.getTime();
		return date;
	}
	
	private static Calendar calendar(Date date) {
		Calendar calendar = Calendar.getInstance();
		if(date != null)
			calendar.setTime(date);
		return calendar;
	}

	/**
	 * 获取当前时间之后几小时 hour
	 * 
	 * @param date
	 * @param hour
	 * @return
	 * @version 1.0 2016年12月27日 下午12:24:14 Asher Xu <br />
	 * @author Asher Xu
	 */
	public static Date beforeAfterHour(Date date, int hour) {
		Calendar calendar = calendar(date);
		calendar.add(Calendar.HOUR_OF_DAY, hour);
		date = calendar.getTime();
		return date;
	}

	/**
	 * 获取当前时间之后几分钟 minute
	 * 
	 * @param date
	 * @param minute
	 * @return
	 * @version 1.0 2016年12月27日 下午12:24:22 Asher Xu <br />
	 * @author Asher Xu
	 */
	public static Date beforeAfterMinute(Date date, int minute) {
		Calendar calendar = calendar(date);
		calendar.add(Calendar.MINUTE, minute);
		date = calendar.getTime();
		return date;
	}

	/**
	 * before 是否在 after 之前<br />
	 * before --> after
	 * 
	 * @param before
	 *            以前时间
	 * @param after
	 *            以后时间
	 * @return
	 * @version 1.0 2016年6月14日 下午7:41:22 Asher Xu
	 * @author Asher Xu
	 */
	public static boolean beforeAfter(Date before, Date after) {
		// before 是否在 after 之前
		boolean flag = before.before(after);
		return flag;
	}

	/**
	 * 统计两个日期之间包含的天数。
	 * 
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static int getDayDiff(Date date1, Date date2) {
		if (date1 == null || date2 == null) {
			throw new InvalidParameterException("date1 and date2 cannot be null!");
		}
		long millSecondsInOneDay = 24 * 60 * 60 * 1000;
		return (int) ((date1.getTime() - date2.getTime()) / millSecondsInOneDay);
	}
}
